package com.yuw.ioemo;

import java.io.*;

public class TestDriver {
    public static void main(String[] args) {
        System.out.println("==================================");
        test01();
        System.out.println("==================================");
        test02();

    }

    /**
     * 字节流——文件输入输出流
     */
    public static void test02() {
        try (
                /*
                如果在 try()括号中初始化了一些变量对象，则try-catch处理机制会自动进行资源回收；
                条件：try()中初始化的变量对象必须继承实现 Clolseable 接口；如果没有实现该接口则不可以这样用
                好处：不用显式的写finally部分
                 */

                // 创建一个文件流对象
                InputStreamReader inputStreamReader = new InputStreamReader(
                        new FileInputStream("D:/temp/filesdemo/temp100.txt"),"utf-8");

                // 创建一个文件输出流
                // 构造方法的第二个参数表示文件内容是否要接着写；默认false：不接着写； true接着写
                OutputStreamWriter outputStreamWriter = new OutputStreamWriter(
                        new FileOutputStream("D:/temp/filesdemo/temp100_2.txt", true),"utf-8");
        ) {

            // 用于存放输入流读取内容的字节数组
            char[] chars = new char[1024];
            // 读取的长度
            int len = 0;
            do {
                // 每次新创建一个数组
                chars = new char[1024];
                // 读取文件内容到字节数组中
                len = inputStreamReader.read(chars);
                if (len != -1) {
                    // 使用bytes数组进行相关业务逻辑处理:打印到控制台
                    String str = new String(chars);
                    System.out.println(str);

                    // 使用文件输出流将其写出到外部文件中
                    outputStreamWriter.write(chars, 0, len);
                }
            } while (len != -1);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 字节流——文件输入输出流
     */
    public static void test01() {
        // 方便资源回收
        FileInputStream fileInputStream = null;
        FileOutputStream fileOutputStream = null;
        try {
            // 创建一个文件流对象
            fileInputStream = new FileInputStream("D:/temp/filesdemo/temp100.txt");

            // 创建一个文件输出流
            // 构造方法的第二个参数表示文件内容是否要接着写；默认false：不接着写； true接着写
            fileOutputStream = new FileOutputStream("D:/temp/filesdemo/temp100_1.txt", true);

            // 用于存放输入流读取内容的字节数组
            byte[] bytes = new byte[1024];
            // 读取的长度
            int len = 0;
            do {
                // 每次新创建一个数组
                bytes = new byte[1024];
                // 读取文件内容到字节数组中
                len = fileInputStream.read(bytes);
                if (len != -1) {
                    // 使用bytes数组进行相关业务逻辑处理:打印到控制台
                    String str = new String(bytes);
                    System.out.println(str);

                    // 使用文件输出流将其写出到外部文件中
                    fileOutputStream.write(bytes, 0, len);
                }
            } while (len != -1);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 关闭资源
            try {
                if (fileInputStream != null) {
                    fileInputStream.close();
                }
                if (fileOutputStream != null) {
                    fileOutputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
